/** 教程链接：
 * https://dart.cn/language/#interfaces-and-abstract-classes
 */
// 抽象类和隐式接口示例

// 抽象类：定义了一个接口和一个带实现的方法
abstract class Describable {
  void describe(); // 抽象方法：没有方法体，需要子类实现

  void describeWithEmphasis() {
    print('=========');
    describe(); // 调用子类实现的方法
    print('=========');
  }
}

// 普通类：Spacecraft
class Spacecraft {
  final String name;

  Spacecraft(this.name);

  void describe() {
    print('Spacecraft: $name');
  }
}

// 实现接口（隐式）：MockSpaceship 实现 Spacecraft 接口
class MockSpaceship implements Spacecraft {
  @override
  String name = 'MockX';

  @override
  void describe() {
    print('Mocking a spacecraft: $name');
  }
}

// 扩展抽象类：MyCraft 继承 Describable 并实现其抽象方法
class MyCraft extends Describable {
  final String name;

  MyCraft(this.name);

  @override
  void describe() {
    print('This is $name');
  }
}

void main() {
  // 使用接口实现类
  final mock = MockSpaceship();
  mock.describe();

  // 使用抽象类的扩展类
  final realCraft = MyCraft('Voyager I');
  realCraft.describeWithEmphasis(); // 调用带实现的方法
}
